#include <iostream>
#include <mutex>
#include <thread>
#include <vector>

using namespace std;


int shared_resource1=0;
int shared_resource2=0;
mutex m1,m2;

void access_shared_resource()
{
     unique_lock<mutex> lock1(m1,defer_lock);  // 安全锁，defer_lock 表示推迟加锁，后面自己lock，没有的话就是立刻上锁 
     unique_lock<mutex> lock2(m2,defer_lock);

     lock(lock1,lock2);   //c++封装的lock可以同时锁定多个锁，一个以上的锁。
    // m1.lock();
    // m2.lock();
    int cnt=10000;
    while(cnt)
    {
        ++shared_resource1;
        ++shared_resource2;
        cnt--;
    }
   // m2.unlock();
   // m1.unlock();
    // 当时使用uniqu_lock结束可以不解锁，因为离开 access_shared_resources 的作⽤域时，lock1 和 lock2 的析构函数会被⾃动调⽤
    // 这会导致它们各⾃的互斥量被⾃动解锁

}


void simulate_concurrent_access()
{
    vector<thread> threads;   //thread是C++提供的线程，是封装好的面向对象的，
                              //pthread是POSIX库的线程，是C语言的风格，面向过程的

    for(int i=0;i<10;i++)
        threads.emplace_back(access_shared_resource);  //emplace_back 传入参数，自动生成对象添加到末尾
    
    for(auto& thread:threads)   //注意这里C++把thread的拷贝构造删除了，这里要使用必须要引用
        thread.join();
    
    cout<<"shared_resource1: "<<shared_resource1<<endl;
    cout<<"shared_resource2: "<<shared_resource2<<endl;
    

}

int main()
{
    simulate_concurrent_access();
}
